
#ifndef __MSG_H__
#define __MSG_H__

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>
#include <string.h>

typedef char Byte;  //定义字节类型

typedef struct
{
    uint32_t version;
    int32_t type;
    uint32_t bodyLen;
    uint32_t expireAfterNow;
    uint32_t clientId;
} MsgHeader;

typedef struct
{
    uint32_t topicLen;
    uint32_t payloadLen;
    Byte *topic;
    Byte *payload;
} MsgBody;

typedef struct
{
    MsgHeader header;
    MsgBody body;
} Msg;

/**
 * 拷贝数组
 * */
Byte* bytesCopy(Byte *src, int start, int end);

/**
 * 创建msg
 * @param type 0：请求，并等待服务器响应；1：请求，不需要服务器响应；2：服务器响应；3：查询消息队列；4：查询消息队列，并删除消息
 * @param expireAfterNow 用于设置消息的过期时间，单位为ms。过期时间 = 服务端接收消息的时间 + expireAfterNow，当expireAfterNow=0时，提交的消息无过期时间
 * */
Msg msgCreate(Byte *topic, Byte *payload, int32_t type, uint32_t clientId, uint32_t expireAfterNow);

/**
 * 将msg转换为byte数组
 * */
Byte * msgToBytes(Msg msg);

/**
 * 获取msg长度
 * */
int msgLength(Msg msg);

/**
 * 获取msgHeader长度
 * */
int msgHeaderLen();

/**
 * 构造MsgHeader
 * */
MsgHeader msgBytesToMsgHeader(Byte* src);

/**
 * 构造Msg
 * @param bodyBytes 消息体字节数组
 * @param header 消息头
 * */
Msg msgBodyBytesToMsg(Byte* bodyBytes, MsgHeader header);

/**
 * 构造Msg
 * @param src 消息字节数组
 * */
Msg msgBytesToMsg(Byte* src);

#ifdef __cplusplus
}
#endif

#endif